package ar.com.sectorwine.services;

import java.util.List;
import java.util.UUID;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import ar.com.sectorwine.entities.Authorities;
import ar.com.sectorwine.entities.PerfilUsuario;
import ar.com.sectorwine.entities.Users;
import ar.com.sectorwine.repository.UsuariosDAO;

@Service
@Transactional(propagation = Propagation.MANDATORY)
public class UsuarioServiceImpl implements UsuarioService {

	@Autowired
	private UsuariosDAO usuariosDAO;
	private static final Logger logger = LoggerFactory
			.getLogger(UsuarioServiceImpl.class);

	@Override
	public boolean crearUsuario(Users usuario) {
		Authorities defaultAuthoritie = new Authorities();
		defaultAuthoritie.setAuthority("USER");
		usuario.getAuthorities().add(defaultAuthoritie);
		usuario.setPerfilUsuario(new PerfilUsuario());
		usuario.setCodigoConfimacion(UUID.randomUUID().toString());
		logger.info("http://localhost:8080/sectorwine/registro_confirmacion?"
				+ "userName=" + usuario.getUsername() + "&"
				+ "codigoConfirmacion=" + usuario.getCodigoConfimacion());
		usuariosDAO.save(usuario);
		return true;
	}

	@Override
	public Users obtenerUsuario(String username) {
		return usuariosDAO.findByUserName(username);
	}

	@Override
	public List<Users> getListaUsuarios() {
		List<Users> listaUsuarios = usuariosDAO.findAll();
		return listaUsuarios;
	}

	@Override
	public Users getUsuario(String id) {
		Users usuario = usuariosDAO.findByUserName(id);
		return usuario;
	}

	@Override
	public void modificarUsuario(Users usuario) {
		usuariosDAO.update(usuario);
		logger.info("USUARIO MODIFICADO");
	}

	@Override
	public boolean bajaUsuario(Users user) {
		try {

			user.getPerfilUsuario().setBaja(true);
			user.setEnabled(false);
			usuariosDAO.update(user);
			logger.info("USUARIO DADO DE BAJA");
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	@Override
	public boolean confirmarRegistro(String userName, String codigoConfirmacion) {
		try {
			Users userConfirmado = usuariosDAO.findByUserName(userName);
			if (userConfirmado.getCodigoConfimacion()
					.equals(codigoConfirmacion)) {
				userConfirmado.setEnabled(true);
				usuariosDAO.save(userConfirmado);
				return true;
			} else {
				return false;
			}

		} catch (Exception e) {
			System.out.println("Error: UsuarioService.confirmarRegistro - "
					+ e.getMessage());
			return false;
		}
	}

	@Override
	public boolean existeUsuario(String userName) {
		try {
			Users usuario = usuariosDAO.findByUserName(userName);
			if (usuario == null) {
				return false;
			} else {
				return true;
			}
		} catch (Exception e) {
			System.out.println("Error: UsuarioService.existeUsuario - "
					+ e.getMessage());
			return false;
		}
	}

	@Override
	public boolean existeCorreo(String correo) {
		try {
			if (usuariosDAO.findByEmail(correo).isEmpty()) {
				return false;
			} else {
				return true;
			}
		} catch (Exception e) {
			System.out.println("Error: UsuarioService.existeCorreo - "
					+ e.getMessage());
			return false;
		}
	}

	@Override
	public boolean isEnable(String userName) {
		try {
			Users usuario = usuariosDAO.findByUserName(userName);
			if (usuario.isEnabled()) {
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			System.out.println("Error: UsuarioService.existeUsuario - "
					+ e.getMessage());
			return false;
		}
	}

}
